`in.iALK` <-
function(f.l,f.a,Sexo=FALSE, zonaC=FALSE, yearC=FALSE, yearA=FALSE, zonaA=FALSE,maxLength=100000,int=1)
	# Se comienza con la seleccion de los datos según el interés de análisis
	{
 	f.length <- f.l$length
  	f.age <- f.a$agelength
	

	if (!(Sexo))
   	 {
                #Elimino los datos del sexo que no me interesa
                PesoTalla2 <- f.length[!is.na(f.length[,3]),]
		#Caso no selecciona Año ni ZOna
		if (yearC==FALSE & zonaC==FALSE) {PesoTallaOr <- PesoTalla2 }
		#Caso Solo Selecciona año
		if (yearC!=FALSE & zonaC==FALSE) { PesoTallaOr <- PesoTalla2[PesoTalla2[,1]==yearC,] }
		#Caso Solo Selecciona zona
		if (yearC==FALSE & zonaC!=FALSE) {PesoTallaOr <- PesoTalla2[PesoTalla2[,2]==zonaC,] }
		#Caso selecciona año y zona
		if (yearC!=FALSE & zonaC!=FALSE) {PesoTallaOr <- PesoTalla2[PesoTalla2[,1]==yearC & PesoTalla2[,2]==zonaC,]}
	  }
	if (Sexo!=3 & (Sexo))
		{
		#Elimino los datos del sexo que no me interesa
               
		PesoTalla2 <- f.length[f.length[,3] == Sexo & !is.na(f.length[,3]),]
		#Caso no selecciona Año ni ZOna
		if (yearC==FALSE & zonaC==FALSE) {PesoTallaOr <- PesoTalla2 }
		#Caso Solo Selecciona año
		if (yearC!=FALSE & zonaC==FALSE) { PesoTallaOr <- PesoTalla2[PesoTalla2[,1]==yearC,] }
		#Caso Solo Selecciona zona
		if (yearC==FALSE & zonaC!=FALSE) {PesoTallaOr <- PesoTalla2[PesoTalla2[,2] ==zonaC,] }
		#Caso selecciona año y zona
		if (yearC!=FALSE & zonaC!=FALSE) {PesoTallaOr <- PesoTalla2[PesoTalla2[,1] ==yearC & PesoTalla2[,2] ==zonaC,]}
		}
  if (Sexo == 3 ) 
		{
		#Caso no selecciona Año ni ZOna
		PesoTalla2 <- f.length[f.length[,3] == Sexo & !is.na(f.length[,3]) & f.length[,4] < maxLength,]
		if (yearC==FALSE & zonaC==FALSE) {PesoTallaOr <- PesoTalla2 }
		#Caso Solo Selecciona año
		if (yearC!=FALSE & zonaC==FALSE) { PesoTallaOr <- PesoTalla2[PesoTalla2[,1]==yearC,] }
		#Caso Solo Selecciona zona
		if (yearC==FALSE & zonaC!=FALSE) {PesoTallaOr <- PesoTalla2[PesoTalla2[,2] ==zonaC,] }
		#Caso selecciona año y zona
		if (yearC!=FALSE & zonaC!=FALSE) {PesoTallaOr <- PesoTalla2[PesoTalla2[,1] ==yearC & PesoTalla2[,2] ==zonaA,]}
		}

	DOr <- matrix(NA, nrow=nrow(PesoTallaOr), ncol=4)

	DOr[,1] <- PesoTallaOr[,1]
	DOr[,2] <- PesoTallaOr[,2]
	DOr[,3] <- PesoTallaOr[,4]
	DOr[,4] <- round(PesoTallaOr[,4]/int)*int
	rm(PesoTallaOr)

	#Create the missing data
	tmp <- matrix(NA, nrow=3, ncol=4)

  if (!(Sexo))
    {
    PesoTalla2 <- f.length[!is.na(f.length[,3]),]
		#No year or zone selected
		if (yearA==FALSE & zonaA==FALSE) {PesoTallaAp <- PesoTalla2}
		#Only year selected
		if (yearA!=FALSE & zonaA==FALSE) {PesoTallaAp <- PesoTalla2[PesoTalla2[,1] == yearA,] }
		#Only zone selected
		if (yearA==FALSE & zonaA!=FALSE) {PesoTallaAp <- PesoTalla2[PesoTalla2[,2] == zonaA,] }
		#Year and zone selected
		if (yearA!=FALSE & zonaA!=FALSE) {PesoTallaAp <- PesoTalla2[PesoTalla2[,1] == yearA & PesoTalla2[,2] ==zonaA,]}
    }
	if (Sexo!=3 & (Sexo))
		{
		PesoTalla2 <- f.length[f.length[,3] == Sexo & !is.na(f.length[,3]),]
		#No year or zone selected
		if (yearA==FALSE & zonaA==FALSE) {PesoTallaAp <- PesoTalla2}
		#Only year selected
		if (yearA!=FALSE & zonaA==FALSE) {PesoTallaAp <- PesoTalla2[PesoTalla2[,1] ==yearA,] }
		#Only zone selected
		if (yearA==FALSE & zonaA!=FALSE) {PesoTallaAp <- PesoTalla2[PesoTalla2[,2] ==zonaA,] }
		#Year and zone selected
		if (yearA!=FALSE & zonaA!=FALSE) {PesoTallaAp <- PesoTalla2[PesoTalla2[,1] ==yearA & PesoTalla2[,2] ==zonaA,]}
		}
	
	if (Sexo==3)
		{
		PesoTalla2 <- f.length[f.length[,3] == Sexo & !is.na(f.length[,3]) & f.length$length < maxLength,]
		#No year or zone selected
		if (yearA==FALSE & zonaA==FALSE) {PesoTallaAp <- PesoTalla2}
		#Only year selected
		if (yearA!=FALSE & zonaA==FALSE) {PesoTallaAp <- PesoTalla2[PesoTalla2[,1] ==yearA,] }
		#Only zone selected
		if (yearA==FALSE & zonaA!=FALSE) {PesoTallaAp <- PesoTalla2[PesoTalla2[,2] ==zonaA,] }
		#Year and zone selected
		if (yearA!=FALSE & zonaA!=FALSE) {PesoTallaAp <- PesoTalla2[PesoTalla2[,1] ==yearA & PesoTalla2[,2] ==zonaA,]}
		}
	
	DAp <- matrix(NA, nrow=nrow(PesoTallaAp), ncol=4)

	DAp[,1] <- PesoTallaAp[,1]
	DAp[,2] <- PesoTallaAp[,2]
	DAp[,3] <- PesoTallaAp[,4]
	DAp[,4] <- round(PesoTallaAp[,4]/int)*int

	#Tabla to construct Age/Length key
	#Getting data for each zone and year if are selected
	if (!(Sexo))
		{
		Edades3<- f.age[!is.na(f.age[,3]),]
		#No year or zone selected
		if (yearC==FALSE & yearC==FALSE) {Edades2 <- Edades3}
		#Only year selected
		if (yearC!=FALSE & zonaC==FALSE) {Edades2 <- Edades3[Edades3[,1] == yearC,] }
		#Only zone selected
		if (yearC==FALSE & zonaC!=FALSE) {Edades2 <- Edades3[Edades3[,2] == zonaC,] }
		#Year and zone selected
		if (yearC!=FALSE & zonaC!=FALSE) {Edades2  <- Edades3[Edades3[,1] == yearC & Edades3[,2]==zonaC,]}
		}
	if (Sexo!=3 & (Sexo))
		{
		Edades3<- f.age[f.age[,3] == Sexo & !is.na(f.age[,3]),]
		#No year or zone selected
		if (yearC==FALSE & yearC==FALSE) {Edades2 <- Edades3}
		#Only year selected
		if (yearC!=FALSE & zonaC==FALSE) {Edades2 <- Edades3[Edades3[,1] == yearC,] }
		#Only zone selected
		if (yearC==FALSE & zonaC!=FALSE) {Edades2 <- Edades3[Edades3[,2] == zonaC,] }
		#Year and zone selected
		if (yearC!=FALSE & zonaC!=FALSE) {Edades2 <- Edades3[Edades3[,1] == yearC & Edades3[,2] == zonaC,]}
		}

	if (Sexo==3 & !(Sexo))
		{
		Edades3<- Edades[!is.na(f.age[,3]),]
		#No year or zone selected
		if (yearC==FALSE & yearC==FALSE) {Edades2 <- Edades3}
		#Only year selected
		if (yearC!=FALSE & zonaC==FALSE) {Edades2 <- Edades3[Edades3[,1] == yearC,] }
		#Only zone selected
		if (yearC==FALSE & zonaC!=FALSE) {Edades2 <- Edades3[Edades3[,2] ==zonaC,] }
		#Year and zone seleted
		if (yearC!=FALSE & zonaC!=FALSE) {Edades2 <- Edades3[Edades3[,1] == yearC & Edades3[,2] == zonaC,]}
		}
	

	##### Now data are ready to be analysed ##

	## ATTENTION, here some data are deleted in order to match the number of classes.
	DOr<-DOr[!is.na(DOr[,4]),]
	DAp<-DAp[!is.na(DAp[,4]),]

	## Utilizo las matrices para filtrar los valores mayores y 
	## menores que las tallas máximas y mínimas que fueron leidas
	## sus edades. Multiplicando las matrices True/False permite 
	## hacer el proceso mucha más rapido que con ciclos for.

	val.min.Or <- as.numeric(!(DOr[,4]<min(round(Edades2[,5]/int)*int)))
	val.max.Or <- as.numeric(!(DOr[,4]>max(round(Edades2[,5]/int)*int)))
	val.Or <- val.min.Or*val.max.Or
	val.Or <- DOr[,4]*val.Or

	men.Or <- (as.numeric(DOr[,4]<min(round(Edades2[,5]/int)*int)))*min(round(Edades2[,5]/int)*int)
	may.Or <- (as.numeric(DOr[,4]>max(round(Edades2[,5]/int)*int)))*max(round(Edades2[,5]/int)*int)
	DOr[,4] <- val.Or + men.Or + may.Or

	val.min.Ap <- as.numeric(!(DAp[,4]<min(round(Edades2[,5]/int)*int)))
	val.max.Ap <- as.numeric(!(DAp[,4]>max(round(Edades2[,5]/int)*int)))
	val.Ap <- val.min.Ap*val.max.Ap
	val.Ap <- DAp[,4]*val.Ap

	men.Ap <- (as.numeric(DAp[,4]<min(round(Edades2[,5]/int)*int)))*min(round(Edades2[,5]/int)*int)
	may.Ap <- (as.numeric(DAp[,4]>max(round(Edades2[,5]/int)*int)))*max(round(Edades2[,5]/int)*int)

	DAp[,4] <- val.Ap + men.Ap + may.Ap


	Clas.Ap <- as.numeric(names(table(DAp[,4])))
	
	Clas.Or <- as.numeric(names(table(DOr[,4])))
	Val.Or <- as.numeric(table(DOr[,4]))
	M.Or <- cbind(Clas.Or,Val.Or)

	#V.M.Or <- cbind(seq(min(round(Edades2[,5]/int)*int), max(round(Edades2[,5]/int)*int), by=int),0)
	V.M.Or <- cbind(seq(min(Clas.Ap), max(Clas.Ap), by=int),0)

	for (i in 1: length(V.M.Or[,1]))
		{
		for (j in 1: length(M.Or[,1]))
			{
			if(V.M.Or[i,1]==M.Or[j,1]) {V.M.Or[i,2] <- M.Or[j,2]}
			}
		}


	##Clas.Ap <- as.numeric(names(table(DAp[,4])))
	Val.Ap <- as.numeric(table(DAp[,4]))
	M.Ap <- cbind(Clas.Ap,Val.Ap)
	
	#V.M.Ap <- cbind(seq(min(round(Edades2[,5]/int)*int), max(round(Edades2[,5]/int)*int), by=int),0)
	V.M.Ap <- cbind(seq(min(Clas.Ap), max(Clas.Ap), by=int),0)
	
	for (i in 1: length(V.M.Ap[,1]))
		{
		for (j in 1: length(M.Ap[,1]))
			{
			if(V.M.Ap[i,1]==M.Ap[j,1]) {V.M.Ap[i,2] <- M.Ap[j,2]}
			}
		}

	Frec.Or <- as.vector(V.M.Or[,2]) #Frequencies with data used to construct the table
	Frec.Ap <- as.vector(V.M.Ap[,2]) #Frequencies with data to applied the table	
	
	##Takin out values of length out of the range of length in the applied population
	TE_men <- (Edades2[,5]<min(Clas.Ap))*min(Clas.Ap)
	TE_may <- (Edades2[,5]>max(Clas.Ap))*max(Clas.Ap)
	Edades2_Lim <- (Edades2[,5]>=min(Clas.Ap) & Edades2[,5]<=max(Clas.Ap))*Edades2[,5]
	Edades2[,5] <- Edades2_Lim + TE_men + TE_may

	# Frecuency table generated with the number of fishes on each Age/Length
	tablaTallaEdad <- as.matrix(table(round(Edades2[,5]/int)*int,Edades2[,4]))

	print("Clases de Pob. Origen")
	print(table(DOr[,4]))
	print("Clases de Pob. Aplicada")
	print(table(DAp[,4]))
	print("Clases de Tabla Talla/Edad Otolo")
	print(tablaTallaEdad[,1])

	Salida <- iALK(tablaTallaEdad,Frec.Or,Frec.Ap)
	Campo <- c("Year of the key","Zone year key","Year applied","Zone appplied","Data N","N Iteracions","Sex")
	Valor <-  c(yearC, zonaC, yearA,zonaA, length(DAp[,4]),iteraciones,Sexo)
  
	Resumen <- cbind(Campo,Valor)
    
	mean<-tapply(round(Edades2[,5]/int)*int,Edades2[,4],mean)
	sd<-tapply(round(Edades2[,5]/int)*int,Edades2[,4],sd)
	n<-tapply(Edades2[,5],Edades2[,4],sum)

	ALkey<-rbind(tablaTallaEdad,mean,sd,n)
	
 	return(list("IALK" = tablaIALK,"Iteracions"=iteraciones,"Resume" = Resumen, "ALkey"=ALkey ))


	}

